home *** CD-ROM | disk | FTP | other *** search
/ Developer Helper 1: Phil & Dave's Excellent CD / Excellent CD HFS.raw / Moof / Goodies / HyperCard Goodies / HyperCard Dev. ToolKit / Video.Drivers / PioneerFNum.p < prev    next >
Text File  |  1987-08-17  |  4KB  |  164 lines

  1. {$R-}
  2. {$D+}
  3. (*
  4.     PioneerFNum  -- a HyperCard user-defined command 
  5.     to  get the frame number back from a Pioneer-LD-V6000  laser disc player.
  6.     By Charles Kerns of Stanford University IRIS project.
  7.     ©Apple Computer, Inc. 1987
  8.     All Rights Reserved.
  9.  
  10.     To compile and link this file using Macintosh Programmer's Workshop
  11.     (HyperXCmd.p and XCmdGlue.inc must be accessible).
  12.  
  13.     pascal -w PioneerFNum.p
  14.     link -m ENTRYPOINT -o HyperCommands -rt XCMD=16 -sn Main=PioneerFNum ∂
  15.       PioneerFNum.p.o "{MPW}"Libraries:interface.o
  16.  
  17.     then use ResEdit to copy the resulting XCMD from HyperCommands
  18.     and paste it into the Home stack, or your own stack.
  19.     (XCMD=11 Panasonic, =12 Hitachi, =13 Phillips, =14 PioneerLDV6000)
  20. *)
  21.  
  22. {$S PioneerFNum }     { Segment name must be the same as the command name. }
  23.  
  24. UNIT DummyUnit;
  25.  
  26. INTERFACE
  27.  
  28.    USES MemTypes, QuickDraw, OsIntf, ToolIntf, HyperXCmd;
  29.     
  30. PROCEDURE EntryPoint(paramPtr: XCmdPtr);
  31.     
  32. IMPLEMENTATION
  33.  
  34.  
  35.    TYPE Str19 = String[19];
  36.            Str31 = String[31];
  37.  
  38.    PROCEDURE PioneerFNum(paramPtr: XCmdPtr);                            FORWARD;
  39.  
  40.    PROCEDURE EntryPoint(paramPtr: XCmdPtr);
  41.    { entry point cannot have local procs, but forward routines can }
  42.    BEGIN
  43.      Pioneerfnum(paramPtr);
  44.    END;
  45.  
  46.    PROCEDURE PioneerFNum(paramPtr: XCmdPtr);
  47.    VAR tempStr: Str255;
  48.        OutrefNum: INTEGER;
  49.        inrefnum:integer;
  50.        InValue:longint; {the value read from player}
  51.        err: INTEGER;
  52.  
  53.      {$I XCmdGlue.inc }
  54.       
  55.      PROCEDURE Fail(errMsg: Str255); { set theResult and quit }
  56.      BEGIN
  57.        paramPtr^.returnValue := PasToZero(errMsg);
  58.        EXIT(PioneerFNum);
  59.      END;
  60.  
  61.      Procedure SetHS(var handShake: SerShk);
  62.      begin
  63.               WITH handShake DO
  64.              BEGIN
  65.                fXon := 1;
  66.                fCTS := 1;
  67.                xon  := CHR(17);
  68.                xoff := CHR(19);
  69.                errs := 0;
  70.                evts := 0;
  71.                fInx := 0;
  72.              END;
  73.     end; {setHS}
  74.     
  75.      FUNCTION OpenSerial(NAME:str255):integer;
  76.      {return the ref num for the serial port that is named by parameter}
  77.      
  78.      VAR handShake: SerShk;
  79.          baudRate: INTEGER;
  80.          refnum:integer;
  81.      BEGIN
  82.        baudRate := 9600;
  83.        err := FSOpen(name,0,refNum);
  84.        
  85.        IF err = 0 THEN 
  86.          BEGIN
  87.          SetHS(handShake);
  88.            err := SerHShake(refNum,handShake);
  89.            IF err = 0 THEN 
  90.              err := Control(refNum,13,@baudRate);
  91.          END;
  92.          OpenSerial := refnum
  93.      END;
  94.  
  95.  
  96.      
  97.      
  98.      PROCEDURE CloseSerial(refnum:integer);
  99.      BEGIN
  100.        err := FSClose(refNum);
  101.      END;
  102.      
  103.      
  104.      PROCEDURE SendCommand(cmd: Str255;refnum:integer);
  105.      VAR count: LongInt;
  106.      BEGIN
  107.        count := Length(cmd);
  108.        err := FSWrite(refNum, count, Pointer(Ord(@cmd)+1));
  109.      END;
  110.      
  111.      Function ReadCommand(RefNum:integer): longint;
  112.      CONST
  113.          kwaittime =120;
  114.          count = 2;
  115.      
  116.      VAR 
  117.            LongCount,Startwait,BytesWaiting,Waitlength,instuff:longint;
  118.            
  119.      BEGIN       
  120.        
  121.      LongCount := count;
  122.        instuff := 0;
  123.        
  124.         StartWait := tickCount;
  125.         repeat
  126.         Err := SerGetBuf(RefNum,BytesWaiting);
  127.         WaitLength := tickcount;
  128.         until (byteswaiting >= count) or (WaitLength -StartWait  > kWaitTime);
  129.         
  130.        if byteswaiting = count then err := FSread(refNum, LongCount, pointer(ord(@instuff)+2))
  131.        else instuff := 0;
  132.        
  133.        ReadCommand := instuff;
  134.      END;
  135.  
  136.  
  137.    BEGIN
  138.      OutRefNum := OpenSerial('.AOUT');
  139.      IF err <> 0 THEN 
  140.        BEGIN
  141.        fail ('could not open serial port');
  142.        END;     
  143.      InRefNum := OpenSerial('.AIN');
  144.     IF err <> 0 THEN 
  145.          BEGIN
  146.                fail ('could not open serial port');
  147.          END;
  148.         
  149.      SendCommand('@E7',OutRefNum);          
  150.      SendCommand('@D3',OutRefNum);
  151.      InValue:= ReadCommand(InRefNum);
  152.      
  153.     tempstr := NumToStr(InValue);
  154.  
  155.      CloseSerial(InRefNum);     
  156.      CloseSerial(OutRefNum);
  157.     
  158.     paramPtr^.returnValue := PasToZero(tempstr);
  159.    END;   
  160.  
  161.  
  162. end.
  163.  
  164.